﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace Dominio.Core.Repositorios
{
    public abstract class RepositorioBase<TEntity> 
        : IRepositorio<TEntity> where TEntity : class
    {
        public DbContext Contexto { get; set; }


        public void Agregar(TEntity entidad)
        {
            Contexto.Set<TEntity>().Add(entidad);
        }

        public void Modificar(TEntity entidad)
        {
            Contexto.Entry<TEntity>(entidad).State = EntityState.Modified;
        }

        public void Eliminar(TEntity entidad)
        {
            Contexto.Entry<TEntity>(entidad).State = EntityState.Deleted;
        }

        public IEnumerable<TEntity> Buscar(Func<TEntity, bool> predicado)
        {
            return Contexto.Set<TEntity>().Where(predicado);
        }

        public void ConfirmarCambios()
        {
            Contexto.SaveChanges();
        }

        public IEnumerable<TEntity> ObtenerTodo()
        {
            return Contexto.Set<TEntity>().ToList();
        }


        public IEnumerable<TEntity> Buscar(Func<TEntity, bool> predicado, int pagina, int tamanioPagina)
        {
            return Contexto.Set<TEntity>().Where(predicado).Skip((pagina - 1) * tamanioPagina)
                                        .Take(tamanioPagina);
        }


        public IEnumerable<TEntity> Buscar<S>(System.Linq.Expressions.Expression<Func<TEntity, bool>> predicado, 
            int pagina, 
            int tamanioPagina,
            System.Linq.Expressions.Expression<Func<TEntity, S>> orderByExpression,
            bool esOrdenAscendente = true)
        {
            return (esOrdenAscendente) ?
                                        Contexto.Set<TEntity>()
                                        .Where<TEntity>(predicado)
                                        .OrderBy(orderByExpression)
                                        .Skip((pagina - 1) * tamanioPagina)
                                        .Take(tamanioPagina)
                                        :
                                        Contexto.Set<TEntity>()
                                        .Where<TEntity>(predicado)
                                        .OrderByDescending(orderByExpression)
                                        .Skip((pagina - 1) * tamanioPagina)
                                        .Take(tamanioPagina);

        }
    }
}
